/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package CTRL;

import Model.Grille;
import View.Vue;
import java.io.IOException;
import java.util.Scanner;

/**
 *
 * @author Karen & Renaud & François
 */
public class playNoLogin {

    private Scanner lecture;
    private Vue vue;
    private Protocol connector;
    private String choix;    //  inputreader
    private Grille grille;
    private int id;
    // private boolean restart;
    //private boolean win;

    public playNoLogin(Vue vue, Protocol connector) {
        this.vue = vue;
        this.connector = connector;
        lecture = new Scanner(System.in);
    }

    public void begin() throws IOException {

        vue.localMenu();  //  auto or manual

        choix = "z";   //  :)
        //System.out.print(choix);
        while (choix.charAt(0) != '1' && choix.charAt(0) != '2' && choix.charAt(0) != 'q') {
            choix = lecture.next();

        }

        switch (choix.charAt(0)) {
            case '1':
                pAuto();
                break;         // creation nouvelle partie auto config
            case '2':
                pConfig();
                break;       // creation nouvelle partie avec configs
            case 'q':
                exit();
                break;          // EXIT
            default:
                break;

        }
    }

    private void pAuto() throws IOException {
        grille = new Grille();
        // tentatives, choix de billes, choix de couleurs 
        vue.printAutoConfig(grille.get_plateau().length, grille.get_combi().length, grille.getNbColors());
        getID();
    }

    private void pConfig() throws IOException {
        grille = vue.configuration(); // creation de la grille (billes + pions + colors)
        getID();
    }

    // fonction qui permet de recevoir id de la partie
    private void getID() throws IOException {
        id = connector.newPartie(grille.get_combi().length, grille.getNbColors());
        playGame();
    }

    private void playGame() throws IOException {
        String msg;         // msg bonne recption d'un encodage 
        //String couleur;
        //int numero=0;
        boolean exit = false;
        boolean restart = false;
        boolean win = false;
        String[] pionsWin;

        while ((grille.numTour < grille.get_plateau().length) && (win == false) && (exit == false) && (restart == false)) {

            vue.msgEnterCombi(grille.numTour + 1);    // print msg num Tour plus entrer votre combi

            //---------- propostion de combinaison    
            msg = lectureCombi();  // on recoit ok si tout va bien, si non reset ou exit


            if (msg.equals("restart") == true) {  // on recommance la même partie
                restart = true;
                grille.numTour = 0;       // reset compteur de tours
                playGame();
            } else if (msg.equals("exit") == true) {
                System.out.println("dans if Exit");
                exit = true;
                exit();  // message de sortie

            } else if (msg.equals("reconfig") == true) { //  joueur veut reconfigurer (nouvelle parite)...
                exit = true;
                begin();

            } else { //si tout va bien
                // System.out.println("placer combi");
                // ---- envoie de combi pour la verification
                grille.placerCombinaison();  // placer la combinaisson  dans le plateau pour afficher l'historique

                pionsWin = connector.sendCombi(id, grille.get_combi(), grille.numTour);  // envoie la combipour la verif & recoit String [] (0 pion noir, 1 pion blanc, 2 win ou pas

                grille.placerPions(Integer.valueOf(pionsWin[0]), Integer.valueOf(pionsWin[1]));

                if (pionsWin[2].equals("true") == true) {
                    win = true;
                }

                // --- incrementation +  affichage de grille 
                grille.numTour++;
                System.out.println('\n');
                vue.printGrille(grille);
                System.out.println("");
            }
        }
        //----- fin de partie

        if (win == true) {
            vue.msgWin(grille.numTour);
            begin ();
            
        }
            // si num tout actuel ==  num tour max  perdu
        if (grille.numTour==grille.getNbTent()) {
            vue.msgFail();
            begin ();
        }

    }

    private String lectureCombi() {
        String out = "NOK";
        String toSplit = "";


        while ((out.equals("OK") == false) && (out.equals("exit") == false) && (out.equals("restart") == false)) {
            // verif s'il n'ya pas un "q" => quiter
            vue.printColors(grille.getNbColors());  // affiche les couelurs dispo
            toSplit = lecture.nextLine();
            while ("".equals(toSplit)) {
                toSplit = lecture.nextLine();
            }

            //  System.out.println("to split ="+toSplit);
            String[] combi = toSplit.split(" ");

            if (combi[0].equals("q") == true) {
                out = "exit";
                break;
            } else if (combi[0].equals("r") == true) {
                out = "restart";
                break;
            } else if (combi.length == grille.getNbColons()) { // so on a bien  le nombre d'element qui = aux nombre de colones

                for (int i = 0; i < grille.getNbColons(); i++) {
                    // System.out.println(" i= "+i);
                    if (combi[i].length() == 1) {  // verifier bien qu'il n'ya qu'1 seul CHAR

                        if ((Character.digit(combi[i].charAt(0), 10) <= grille.getNbColors())
                                && (Character.digit(combi[i].charAt(0), 10) > 0)) { // verif si c'est bien un chifre entre 0 et nbcouleurs
                            grille.choisirBille(i, combi[i].charAt(0));
                            out = "OK";
                        } else { // c'est pas une bonne couleure
                            out = "WRONGCHAR";
                            break;
                        }
                    } else { // il ya un plus d'un char  on recommance 
                        out = "PLUS1CHAR";
                        break;
                    }
                } // end for
            }

        }
        //System.out.println("out "+out); 
        //grille.printCombi();

        return out;
    }

    // EXIT -------------
    private void exit() {
        vue.msgExit();
    }
}
